/**
 * 
 */
package interfacesRemotas;

import java.net.InetAddress;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import accesoRepositorio.AccesoBalance;
import accesoRepositorio.AccesoCarta;
import accesoRepositorio.AccesoMesa;
import accesoRepositorio.AccesoObservaciones;
import accesoRepositorio.AccesoPedido;
import accesoRepositorio.AccesoReserva;
import accesoRepositorio.AccesoRestaurante;
import accesoRepositorio.ConexionBD;


/**
 * @author Eusebio J. Aguilera Aguilera
 * @date 03/05/2007, 04/05/2007, 06/05/2007, 07/05/2007
 * @version 2.0
 * Esta clase crea un servidor que muestra los objetos que se puedan usar de forma remota.
 */
public class ServidorRMI {
	
	/**
	 * Puerto por el que se va a atender las peticiones
	 */
	private static final int PORT = 1099;
	/**
	 * Nombre del host servidor
	 */
	public static String HOST;
	
	
	/**
	 * El constructor de la clase ServidorRMI establece los parámetros necesarios para que RMI funcion. Además hace públicos los objetos remotos.
	 * @param ruta Ruta hasta las clases remotas.
	 */
	public ServidorRMI( String ruta ) throws RemoteException, MalformedURLException, NotBoundException
	{
		try {
			// Se indica a rmiregistry dónde están las clases.
			// Cambiar el paht al sitio en el que esté. Es importante
			// mantener la barra al final.
			System.setProperty(
				"java.rmi.server.codebase",
				"file:/" + ruta + "/");
			
			// Iniciamos el servidor RMIRegistry
			LocateRegistry.createRegistry( PORT );
			
			// Se publica el objeto AccesoMesa
			interfazMesa accesoMesa = new AccesoMesa();
			Naming.rebind("//localhost/AccesoMesa", accesoMesa);
			
			InterfazRestaurante accesoRestaurante = new AccesoRestaurante();
			Naming.rebind("//localhost/AccesoRestaurante", accesoRestaurante);
			
			InterfazCarta accesoCarta = new AccesoCarta();
			Naming.rebind("//localhost/AccesoCarta", accesoCarta);
			
			InterfazPedido accesoPedido = new AccesoPedido();
			Naming.rebind("//localhost/AccesoPedido", accesoPedido);
			
			InterfazReserva accesoReserva = new AccesoReserva();
			Naming.rebind("//localhost/AccesoReserva", accesoReserva);
			
			InterfazObservaciones accesoObservaciones = new AccesoObservaciones();
			Naming.rebind("//localhost/AccesoObservaciones", accesoObservaciones);
			
			InterfazBalance accesoBalance = new AccesoBalance();
			Naming.rebind("//localhost/AccesoBalance", accesoBalance);
			
			HOST = InetAddress.getLocalHost().getHostName();
			
			System.out.println("Servicio RMI activo en " + HOST + " sobre el puerto " + PORT);
			
		} catch (Exception e) {
			System.err.println("Error en la ejecucion de RMI: " + e.getMessage());
		}
	}
	
	public static void main(String[] args) {
		
		try 
		{
			if ( args.length > 0 )
			{
				new ServidorRMI( args[0] );
			}
			else
			{
				new ServidorRMI( "./" );
			}
		}
		catch ( java.rmi.UnknownHostException uhe )
		{
			System.out.println( "El nombre de host especificado no coincide con el nombre de host real." );

		}
		catch ( RemoteException re )
		{
			System.out.println( "Error iniciando servicio" );
			System.out.println( "" + re.getMessage() );
		}
		catch ( MalformedURLException mURLe )
		{
			System.out.println( "Error interno" + mURLe.getMessage() );
		}
		catch ( NotBoundException nbe )
		{
			System.out.println( "Not Bound" );
			System.out.println( "" + nbe.getMessage() );
		}
	}
}
